﻿using System;
using System.Data;
using E4RPTools;
using TakeAway.DataSet;

namespace TakeAway
{
    public class Validator
    {
        private static void ValidateClient(ClienteDataSet.ClienteRow client, Result result)
        {
            //if (client.Numero.Length == 0) result.Add("Numero", "Por favor, preencha o número.");
            //if (client.Numero.Length > 10) result.Add("Numero", "O número excede os 10 caracteres permitidos.");
            if (client.IsNomeNull() || client.Nome == "") result.Add("Nome", "Por favor, preencha o nome.");
            if (!client.IsNomeNull() && client.Nome.Length > 55) result.Add("Nome", "O nome excede os 55 caracteres permitidos.");
            if (client.IsTelefoneNull() || client.Telefone == "") result.Add("Telefone", "Por favor, preencha o telefone.");
            if (!client.IsTelefoneNull() && client.Telefone.Length > 50) result.Add("Telefone", "O telefone excede os 50 caracteres permitidos.");
            if (!client.IsTelemovel1Null() && client.Telemovel1.Length > 60) result.Add("Telemovel1", "O telemóvel excede os 60 caracteres permitidos.");            
            if (!client.IsTelemovel2Null() && client.Telemovel2.Length > 60) result.Add("Telemovel2", "O telemóvel excede os 60 caracteres permitidos.");            
            if (!client.IsTelemovel3Null() && client.Telemovel3.Length > 60) result.Add("Telemovel3", "O telemóvel excede os 60 caracteres permitidos.");
            if (!client.IsContribuinteNull() && client.Contribuinte.Length > 18) result.Add("Contribuinte", "O contribuinte excede os 18 caracteres permitidos.");
            if (!client.IsEmailNull() && client.Email.Length > 45) result.Add("Email", "O email excede os 45 caracteres permitidos.");

            if (client.IsLojaCasaNull() || client.LojaCasa == "") result.Add("LojaCasa", "Por favor, preencha a loja.");
            if (!client.IsLojaCasaNull() && client.LojaCasa.Length > 20) result.Add("LojaCasa", "A loja excedem os 20 caracteres permitidos.");
            if (client.IsMoradaCasaNull() || client.MoradaCasa == "") result.Add("MoradaCasa", "Por favor, preencha a morada.");
            if (!client.IsMoradaCasaNull() && client.MoradaCasa.Length > 55) result.Add("MoradaCasa", "A morada excede os 55 caracteres permitidos.");
            if (client.IsCidadeCasaNull() || client.CidadeCasa == "") result.Add("CidadeCasa", "Por favor, preencha o cidade.");
            if (!client.IsCidadeCasaNull() && client.CidadeCasa.Length > 43) result.Add("CidadeCasa", "A cidade excede os 43 caracteres permitidos.");
            if (!client.IsCodigoPostalCasaNull() && client.CodigoPostalCasa.Length > 45) result.Add("CodigoPostalCasa", "O código postal excede os 43 caracteres permitidos.");
            if (client.IsLojaCasaNull() || client.LojaCasa == "") result.Add("LojaCasa", "Por favor, preencha a loja.");
            if (!client.IsLojaCasaNull() && client.LojaCasa.Length > 20) result.Add("LojaCasa", "A loja excede os 20 caracteres permitidos.");
            if (client.IsZonaCasaNull() || client.ZonaCasa == "") result.Add("ZonaCasa", "Por favor, preencha a zona.");
            if (!client.IsZonaCasaNull() && client.ZonaCasa.Length > 13) result.Add("ZonaCasa", "A zona excede os 13 caracteres permitidos.");
            if (!client.IsObservacoesCasaNull() && client.ObservacoesCasa.Length > 254) result.Add("ObservacoesCasa", "As observações excedem os 254 caracteres permitidos.");

            if (!client.IsLojaFeriasNull() && client.LojaFerias.Length > 20) result.Add("LojaFerias", "A loja excedem os 20 caracteres permitidos.");
            if (!client.IsMoradaFeriasNull() && client.MoradaFerias.Length > 55) result.Add("MoradaFerias", "A morada excede os 55 caracteres permitidos.");
            if (!client.IsCidadeFeriasNull() && client.CidadeFerias.Length > 43) result.Add("CidadeFerias", "A cidade excede os 43 caracteres permitidos.");
            if (!client.IsCodigoPostalFeriasNull() && client.CodigoPostalFerias.Length > 45) result.Add("CodigoPostalFerias", "O código postal excede os 43 caracteres permitidos.");
            if (!client.IsZonaFeriasNull() && client.ZonaFerias.Length > 13) result.Add("ZonaFerias", "A zona excede os 13 caracteres permitidos.");
            if (!client.IsLojaFeriasNull() && client.LojaFerias.Length > 20) result.Add("LojaFerias", "A loja excede os 20 caracteres permitidos.");
            if (!client.IsObservacoesFeriasNull() && client.ObservacoesFerias.Length > 254) result.Add("ObservacoesFerias", "As observações excedem os 254 caracteres permitidos.");            

            if (!client.IsLojaEmpresaNull() && client.LojaEmpresa.Length > 20) result.Add("LojaEmpresa", "A loja excedem os 20 caracteres permitidos.");
            if (!client.IsMoradaEmpregoNull() && client.MoradaEmprego.Length > 55) result.Add("MoradaEmprego", "A morada excede os 55 caracteres permitidos.");
            if (!client.IsCidadeEmpregoNull() && client.CidadeEmprego.Length > 43) result.Add("CidadeEmprego", "A cidade excede os 43 caracteres permitidos.");
            if (!client.IsCodigoPostalEmpregoNull() && client.CodigoPostalEmprego.Length > 45) result.Add("CodigoPostalEmprego", "O código postal excede os 43 caracteres permitidos.");
            if (!client.IsLojaEmpresaNull() && client.LojaEmpresa.Length > 20) result.Add("LojaEmpresa", "A loja excede os 20 caracteres permitidos.");
            if (!client.IsZonaEmpregoNull() && client.ZonaEmprego.Length > 13) result.Add("ZonaEmprego", "A zona excede os 13 caracteres permitidos.");
            if (!client.IsObservacoesEmpregoNull() && client.ObservacoesEmprego.Length > 254) result.Add("ObservacoesEmprego", "As observações excedem os 254 caracteres permitidos.");
        }

        private static void SetRowError(DataRow request, string rowError)
        {
            if (request.RowError.Length > 0) request.RowError += Environment.NewLine;
                request.RowError += rowError;
        }

        private static void ValidateRequest(PedidoDataSet.PedidoRow request, Result result)
        {
            if (request.IsEmissaoNull() || request.Emissao == DateTime.MinValue) result.Add("Emissao", "Por favor, preencha a data de emissão.");
            if (request.IsEstadoNull() || request.Estado.Length == 0) result.Add("Estado", "Por favor, preencha o estado.");
            if (!request.IsEstadoNull() && request.Estado.Length > 50) result.Add("Estado", "O estado excede os 50 caracteres permitidos.");
            if (request.IsMoradaNull() || request.Morada == "") result.Add("Morada", "Por favor, preencha a morada.");
            if (!request.IsMoradaNull() && request.Morada.Length > 55) result.Add("Morada", "A morada excede os 55 caracteres permitidos.");
            if (request.IsCodigoPostalNull() || request.CodigoPostal == "") result.Add("CodigoPostal", "Por favor, preencha o código postal.");
            if (!request.IsCodigoPostalNull() && request.CodigoPostal.Length > 45) result.Add("CodigoPostal", "O código postal excede os 43 caracteres permitidos.");            
            if (request.IsCidadeNull() || request.Cidade == "") result.Add("Cidade", "Por favor, preencha a cidade.");
            if (!request.IsCidadeNull() && request.Cidade.Length > 43) result.Add("Cidade", "A cidade excede os 43 caracteres permitidos.");
            if (request.IsZonaNull() || request.Zona == "") result.Add("Zona", "Por favor, defina a zona.");
            if (!request.IsZonaNull() && request.Zona.Length > 13) result.Add("Zona", "A zona excede os 13 caracteres permitidos.");
            if (request.IsLojaNull() || request.Loja == "") result.Add("Loja", "Por favor, defina a loja.");
            if (!request.IsLojaNull() && request.Loja.Length > 20) result.Add("Loja", "A loja excede os 13 caracteres permitidos."); 
            if (!request.IsPontoReferenciaNull() && request.PontoReferencia.Length > 255) result.Add("PontoReferencia", "O ponto de refência excede os 255 caracteres permitidos.");
            if (request.IsTipoLocalNull() || request.TipoLocal < 0) result.Add("TipoLocal", "Por favor, defina o tipo de local.");
            //if (request.IsClienteNull() || request.Cliente == "") result.Add("Cliente", "Por favor, preencha a zona.");
            if (request.IsValorNull() || request.Valor < 0) //result.Add("Valor", "Por favor, preencha o valor a pagar.");
                SetRowError(request, "Por favor, preencha o valor a pagar.");
            if (request.IsValorPagoNull() || request.ValorPago < 0) //result.Add("ValorPago", "Por favor, preencha o valor pago.");
                SetRowError(request, "Por favor, preencha o valor pago.");
            if (!request.IsValorPagoNull() && !request.IsValorNull() && request.ValorPago < request.Valor) //result.Add("ValorPago", "Por favor, indique um valor a pagar pelo cliente superior ou igual ao valor a pagar.");
                SetRowError(request, "Por favor, indique um valor a pagar pelo cliente superior ou igual ao valor a pagar.");
            if (request.IsTipoPagamentoNull()) //result.Add("TipoPagamento", "Por favor, preencha o tipo de pagamento.");
                SetRowError(request, "Por favor, preencha o tipo de pagamento.");
            if (!request.IsTipoPagamentoNull() && request.TipoPagamento == PaymentType.DINHEIRO.ToString() && !request.IsValorNull() && !request.IsValorPagoNull() && request.ValorPago < request.Valor)
                SetRowError(request, "Por favor, indique um valor a pagar pelo cliente superior ou igual ao valor a pagar.");
            //result.Add("ValorPago", "Por favor, indique um valor a pagar pelo cliente superior ou igual ao valor a pagar.");
        }

        private static void ClearErrors(DataTable table)
        {
            foreach (DataRow row in table.Rows)
                row.ClearErrors();
        }

        private static void ValidateRequestItem(PedidoDataSet.ItemPedidoRow requestItem)
        {
            if (requestItem.RowState == DataRowState.Deleted)
                return;
            if (requestItem.IsReferenciaProdutoNull() || requestItem.ReferenciaProduto == "")
                requestItem.SetColumnError("ReferenciaProduto", "Por favor, preencha o produto.");
            if (requestItem.IsNomeProdutoNull() || requestItem.NomeProduto == "")
                requestItem.SetColumnError("NomeProduto", "Por favor, preencha o produto.");
            if (requestItem.IsFamiliaNull() || requestItem.Familia == "")
                requestItem.SetColumnError("Familia", "Por favor, preencha a família do produto.");
            if (requestItem.IsQuantidadeNull() || requestItem.Quantidade < 0)
                requestItem.SetColumnError("Quantidade", "Por favor, a quantidade não pode ser negativo.");
            if (requestItem.IsPercentagemIvaNull() || requestItem.PercentagemIva < 0)
                requestItem.SetColumnError("PercentagemIva", "Por favor, a percentagem de iva não pode ser negativa.");
            if (requestItem.IsValorNull() || requestItem.Valor < 0)
                requestItem.SetColumnError("Valor", "Por favor, o valor não pode ser negativo.");
            if (requestItem.IsValorTotalNull() || requestItem.ValorTotal < 0)
                requestItem.SetColumnError("ValorTotal", "Por favor, o valor total não pode ser negativo.");
            if (!requestItem.IsObservacoesNull() && requestItem.Observacoes.Length > 1000)
                requestItem.SetColumnError("Observacoes", "Por favor, as observações excede os 1000 caracteres permitidos.");
            if (requestItem.IsPrecoTabelaNull() || requestItem.PrecoTabela < 0)
                requestItem.SetColumnError("PrecoTabela", "Por favor, o preco tabela pode ser negativa.");
            if (requestItem.IsStockNull() )
                requestItem.SetColumnError("Stock", "Por favor, o produto ñão tem definido se gera stock ou não.");            
        }


        public static Result ValidateSave(PedidoDataSet request, ClienteDataSet client)
        {
            var result = new Result();
            ValidateClient(client.Cliente[0], result);
            if(result.Failed)
                return result;
            request.Pedido[0].RowError = "";
            ValidateRequest(request.Pedido[0], result);
            ClearErrors(request.ItemPedido);
            if(request.ItemPedido.Count == 0)
                SetRowError(request.Pedido[0], "Por favor, insira items no pedido.");
            foreach(var requestItem in request.ItemPedido)
                ValidateRequestItem(requestItem);
            return result;
        }

        public static Result ValidateBill(PedidoDataSet request, ClienteDataSet client, bool allInOne)
        {
            var result = ValidateSave(request, client);
            if(result.Failed)
                return result;
            //if (client.Cliente[0].IsContribuinteNull() || client.Cliente[0].Contribuinte == "") result.Add("Contribuinte", "Por favor, defina o contribuinte.");
            if (request.Pedido[0].Estado == RequestState.Facturado.ToString() || request.Pedido[0].Estado == RequestState.Fechado.ToString())  result.Add("Estado", "O pedido já se encontra facturado");
            if (allInOne)
                return result;
            if (request.Pedido[0].Estado == RequestState.Novo.ToString() || request.Pedido[0].Estado == RequestState.Cancelado.ToString() || request.Pedido[0].Estado == RequestState.Substituido.ToString()) result.Add("Estado", "O estado do pedido não pertmite que seja facturado");
            return result;
        }
    }
}
